package com.itheima.utils;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * @Author zhouxiangyang
 * @Date 2021/6/28 18:09
 * 需求：将jedis的连接池封装到该工具类中，对外提供一个方法，从连接池中获取jedis连接。
 * 分析：
 *    1 在src中新建redis.properties属性文件，编写连接redis的相关参数。
 *    2 在static静态代码块中读取redis.properties属性文件
 *    3 在static静态代码块中初始化jedis连接池对象
 *    4 对外提供一个静态方法，从连接池中获取连接
 *    5 对外提供一个方法，释放资源。
 */
public class JedisUtils {
    private static JedisPool jedisPool;
    static {
        //2 在static静态代码块中读取jedis.properties属性文件
        //2.1 创建Properties属性集合对象
        Properties properties=new Properties();
        //2.2 通过类加载器获取properties属性文件的输入流对象
        InputStream is = JedisUtils.class.getClassLoader().getResourceAsStream("redis.properties");
        try {
            //2.3 加载属性文件
            properties.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //2.4 从properties中获取连接redis需要的数据
        String host = properties.getProperty("redis.host");
        int port = Integer.parseInt(properties.getProperty("redis.port"));
        int timeout = Integer.parseInt(properties.getProperty("redis.timeout"));
        String password = properties.getProperty("redis.auth");
        int maxActive = Integer.parseInt(properties.getProperty("redis.maxActive"));  //最大连接数

        //3 在static静态代码块中初始化jedis连接池对象
        //3.1 创建连接池配置对象
        JedisPoolConfig config=new JedisPoolConfig();
        config.setMaxTotal(maxActive); //设置最大连接数
        //3.2 创建连接池对象
        // public JedisPool(GenericObjectPoolConfig poolConfig, String host, int port, int timeout, String password)
        jedisPool = new JedisPool(config,host,port,timeout,password);
    }

    //4 对外提供一个静态方法，从连接池中获取连接
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }
    //5 对外提供一个方法，释放资源。
    public static void close(Jedis jedis){
        if(jedis!=null){
            jedis.close();
        }
    }
}
